#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>

auto find_circle = [](std::vector<cv::Point>& cnt,std::vector<cv::Point2f> &centers,std::vector<float> &radii){
        // 面积过滤
    double area = cv::contourArea(cnt);//参数还不好调
    if (area < 100) {
        return false;
    };
    // 圆形度检测
    double perimeter = cv::arcLength(cnt, true);
    double circularity = 4 * CV_PI * area / (perimeter * perimeter);
    if (circularity < 0.7) {
        return false;
    }

    // 最小包围圆
    cv::Point2f center;
    float radius;
    cv::minEnclosingCircle(cnt, center, radius);
    centers.push_back(center);
    radii.push_back(radius);
    return true;
};
int main(){
    // 创建一个灰度图像（大小为400x400，初始灰度值为128）
    cv::Mat ball;
    ball =  cv::imread("../img/ball.jpg");
    // cv::imshow("ball",ball);
    // cv::waitKey(1);
    std::vector<cv::Mat> channels;
    cv::split(ball, channels);//bgr
    // cv::Mat c0 = channels[0];
    // cv::Mat c1 = channels[1];
    // cv::Mat c2 = channels[2];
    // cv::imshow("c0",c1);
    // cv::imshow("c1",c1);
    // cv::imshow("c2",c1);
    cv::Mat bin;
    cv::threshold(channels[2]-channels[0], bin, 100, 255,
                  cv::THRESH_BINARY);//减法真好用
    // cv::imshow("bin",bin);
    // cv::waitKey(0);
    // std::vector<std::vevtor<cv::Point2f>> contour;
    std::vector<std::vector<cv::Point>> int_contours;
    cv::findContours(bin, int_contours, cv::RETR_LIST,
                     cv::CHAIN_APPROX_SIMPLE);
    std::cout<<"大小"<<int_contours.size();
    std::vector<cv::Point2f> centers;
    std::vector<float> radii;
    for(auto& it:int_contours ){
        find_circle(it,centers,radii);
    }
    cv::Mat ball_contours = ball.clone();
    cv::drawContours(ball_contours,int_contours,-1,cv::Scalar(255,0,0),2);
    cv::imshow("contours",ball_contours);
    cv::waitKey(0);
    std::cout<<"\n园大小"<<centers.size()<<std::endl;

    // cv::Mat grayImage(1280, 1040, CV_8UC1, cv::Scalar(0));
    // ball
    return 0;
}